# 导包
import re

from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from apps.users.models import User
from meiduo_mall.settings.dev import logger

# 封装检验手机号或用户名的函数
def get_user_by_account(account):

    try:
        # 判断是否符合手机号正则
        # 如果是则为手机号登录
        if re.match(r'^1[3-9]\d{9}$', account):
            user = User.objects.get(mobile=account)
        else:
            # 不是则为用户名登录
            user = User.objects.get(username=account)
    except Exception as e:
        logger.error("用户对象不存在")
        print(e)
        return None
    else:
        return user

# 认证用户名和密码
class UsernameMobileAuthBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        # 前台调用authenticate传request  后台调用时不传request
        if request is None:
            try:  # 查询指定且是管理员的用户
                user = User.objects.get(username=username, is_staff=True)
            except:
                return None
                # 判断密码
            if user.check_password(password):
                return user
        else:
            # 变量username的值，可以是用户名，也可以是手机号，需要判断，再查询
            # 实现多帐号(用户名和密码叫多帐号)登录
            user = get_user_by_account(username)
            # 判断有用户存在且密码正确
            if user and user.check_password(password):
                return user
            else:
                return None

# 定义生成加密邮箱验证链接方法
def generate_verify_email_url(user):
    # 1.加密的数据
    data_dict = {'user_id': user.id, "email": user.email}
    # 2. 进行加密数据
    from utils.secret import SecretOauth
    # 加密后的数据为二进制.需要解码才能发给前端
    secret_data = SecretOauth().dumps(data_dict)
    # 3. 返回拼接url
    active_url = settings.EMAIL_ACTIVE_URL + '?token=' + secret_data
    return active_url

